﻿#ifndef THREAD_SESSAO_H
#define THREAD_SESSAO_H

#include "../model/DadosArquivo.h"
#include "Operacoes.h"
#include "../model/Cliente.h"

#include <QDebug>
#include <QObject>
#include <QTcpSocket>
#include <QRunnable>
#include <QByteArray>
#include <QThread>
#include <QPair>
#include <QDataStream>

Q_DECLARE_METATYPE( QAbstractSocket::SocketError );

namespace controller
{
	class ServidorAplicacao;

	class ThreadSessao : public QThread
	{
		Q_OBJECT
		public:
			ThreadSessao( ServidorAplicacao *servidor, int socketDescriptor, QObject *parent );
			virtual ~ThreadSessao();
			void run();

		protected:
			virtual void handlePing();

			virtual void handleAdicionarArquivo(); // OK
			virtual void handleAdicionarArquivos(); // Nao Testado
			virtual void handleApagarArquivo(); // OK
			virtual void handleGetArquivo(); // OK
			virtual void handleGetArquivoPorExt(); // Nao Testado
			virtual void handleGetDadosArquivo(); // Nao Testado
			virtual void handleListarDiretorio(); // Nao Testado
			virtual void handleRenomearArquivo(); // Nao Testado
			virtual void handleFecharArquivo(); // OK

			virtual void handleLoginCliente(); // OK
			virtual void handleCadastrarCliente(); // OK
			virtual void handleLogoutCliente(); // OK

			virtual void waitWrite();
			virtual void waitRead( bool firstWait = true );
		private:
			QDataStream *stream;
			QByteArray array;
			model::Cliente *cliente;
            ServidorAplicacao *servidor;
			QTcpSocket *socket;

			int socketDescriptor;

			QString* getError( const char* );
		signals:
            void terminado( ThreadSessao* );

		public slots:
			void read();
			void close();
	};
}

#endif
